<!-- 
  首页
 -->

<!--
  视图层
-->
<template><header-comp />

<!-- 数据预处理 -->
<card-comp title="数据预处理">
  <!-- 通告栏 -->
  <uni-notice-bar text=
    "可一键将大量拉曼光谱数据处理为excel表格数据。"
  />
  <!-- 二级标题：文件格式转换 -->
  <section-comp title="文件格式转换">
    <!-- 文字内容 -->
    <view>
      　　可批量将Andor拉曼光谱仪的.sif数据文件转为txt化的.asc文档文件。<br />
      　　使用方法：<br />
      　　1. 将想要转换格式的.sif文件统一放进一个文件夹内；<br />
      　　2. 将本.pgm脚本文件也放进.sif文件夹内；<br />
      　　3. 在Andor SOLIS软件里，"File" - "Run Program By Filename"，选择本.pgm脚本文件运行，即可批量生成.asc文件。<br />
      　　详细说明见下“数据文件合并”。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="downloadExampleFile()"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        下载AndorSifsToAscs脚本
      </button>
    </view>
  </section-comp>
  <!-- 二级标题：数据文件合并 -->
  <section-comp title="数据文件合并">
    <!-- 文字内容 -->
    <view>
      　　可一键将大量.asc数据文档文件合并导出为一个excel表格文件。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/pretreat/andor-ascs-to-xlsx')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        数据文件合并
      </button>
    </view>
  </section-comp>
</card-comp>

<!-- 基线校正 -->
<card-comp title="基线校正">
  <!-- 通告栏 -->
  <uni-notice-bar text=
    "拉曼光谱数据质量较差时，基线往往极不平整。需要拟合基线趋势后，从原谱图数据中扣除基线。
    若数据质量好，则可不用进行基线校正。"
  />
  <!-- 二级标题：多项式迭代回归 -->
  <section-comp title="多项式迭代回归">
    <!-- 文字内容 -->
    <view>
      　　多项式迭代回归（Polynomial Iterative Regression）。<br />
      　　通过简单的多项式拟合实现基线校正的算法，参数简单可控，符合拉曼谱图基线校正的基本需求。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/ml/poly-iter-reg')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        多项式迭代回归
      </button>
    </view>
  </section-comp>
  <!-- 二级标题：滚球算法 -->
  <section-comp title="滚球算法">
    <!-- 文字内容 -->
    <view>
      　　滚球算法（Rolling-Ball Algorithm），也叫滚珠算法。<br />
      　　立足于几何学的基线校正算法，灵感来源于计算机对图像的几何学处理。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/ml/rolling-ball')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        滚球算法
      </button>
    </view>
  </section-comp>
  <!-- 二级标题：迭代自适应加权惩罚最小二乘 -->
  <section-comp title="迭代自适应加权惩罚最小二乘 airPLS">
    <!-- 文字内容 -->
    <view>
      　　迭代自适应加权惩罚最小二乘（Adaptive Iterative Reweighted Penalized Least Squares, airPLS）。<br />
      　　发展自惩罚最小二乘法（Penalized Least Squares, PLS），并优化了迭代过程、自适应加权、惩罚项（正则化）。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/ml/airpls/')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        迭代自适应加权惩罚最小二乘 airPLS
      </button>
    </view>
  </section-comp>
</card-comp>

<!-- 数据对齐 -->
<card-comp title="数据对齐">
  <!-- 通告栏 -->
  <uni-notice-bar text=
    "不同批次测量得到的拉曼光谱数据，会因光谱仪光栅刻线精度、校准等原因而出现X轴数据对不齐的情况。
    此时需对数据操作进行操作，确保各批次光谱数据在X轴上的拉曼位移数值是一致的。"
  />
  <!-- 二级标题：S-G平滑 -->
  <section-comp title="S-G平滑">
    <!-- 文字内容 -->
    <view>
      　　Savitzky-Golay算法，简称S-G平滑法。<br />
      　　通过局域多项式拟合的方法，在平滑光谱数据的同时，可重建出原光谱数据中的X轴拉曼位移数据。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/ml/sg')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        S-G平滑
      </button>
    </view>
  </section-comp>
  <!-- 二级标题：全波谱去卷积 -->
  <section-comp title="全波谱去卷积 GSD">
    <!-- 文字内容 -->
    <view>
      　　全波谱去卷积（Global Spectra Deconvolution, GSD）。<br />
      　　发展自波谱去卷积算法（Spectral Deconvolution, SD），以“寻找并确定光谱峰”的思路出发，对谱图进行标峰、峰型拟合等操作，并通过获得的光谱峰重建谱图数据。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/ml/gsd')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
        全波谱去卷积 GSD
      </button>
    </view>
  </section-comp>
</card-comp>

<!-- 数据降维 -->
<card-comp title="数据降维">
  <!-- 通告栏 -->
  <uni-notice-bar text=
    "拉曼光谱数据中存在大量的冗余信息，做回归分析时会面临“多重共线性”问题，因此有必要对谱图数据进行降维。"
  />
  <!-- 二级标题：PLS -->
  <section-comp title="偏最小二乘 PLS">
    <!-- 文字内容 -->
    <view>
      　　偏最小二乘（Partial Least Squares, PLS）。<br />
      　　监督学习的回归方法，能够同时将特征与标签纳入回归模型，以实现有监督的数据降维。
    </view>
    <!-- 页内导航 -->
    <view class="center">
      <button
        @click="goToPage('/ml/pls')"
        type="primary" size="mini" :plain="false"
        :disabled="false"
      >
      
        偏最小二乘
      </button>
    </view>
  </section-comp>
</card-comp>

<!-- 深度学习方法 -->
<card-comp title="深度学习方法">
  <!-- 通告栏 -->
  <uni-notice-bar text=
    "敬请期待。"
  />
</card-comp>

<!-- 关于本应用 -->
<card-comp title="关于本应用">
  <!-- 文字内容 -->
  <view>
    　　以
    <uni-link
      text="uni-app (@Vue3) "
      href="https://uniapp.dcloud.net.cn/"
      color="blue"
    />
    构建的页面应用 (WebApp)，并通过
    <uni-link
      text="AtomGit Pages"
      href="https://docs.atomgit.com/app/pages/"
      color="blue"
    />
    实现免费页面托管。主要用于拉曼光谱数据处理，包含了光谱数据的扣基线、标峰、波数对齐、降维等功能。<br />
    　　基本的数据表格读写方面，选用了
    <uni-link
      text="SheetJS"
      href="https://xlsx.nodejs.cn/docs/"
      color="blue"
    />
    库。机器学习业务方面，主要选用了
    <uni-link
      text="ml.js"
      href="https://github.com/mljs/ml"
      color="blue"
    />
    库。深度学习方面，选用了
    <uni-link
      text="Keras (@TensorFlow.js)"
      href="https://tensorflow.google.cn/js?hl=zh-cn"
      color="blue"
    />
    技术栈，并借助
    <uni-link
      text="TensorFlow.js"
      href="https://js.tensorflow.org/api/latest/?hl=zh-cn"
      color="blue"
    />
    原生对WebGPU硬件加速实现，完成便捷的张量运算。其它技术栈详见链接。<br />
    　　一切旨在学习。热烈欢迎bug反馈即各类技术/知识交流！
  </view>
</card-comp>

<!-- 页脚(下) -->
<footer-comp /></template>

<!--
  逻辑层
-->
<script setup>
// 从入口文件引入各类全局方法
import { goToPage, downloadFile } from "@/assets/app-utils.js"

/**
 * 下载示例文件
 * @async
 */
async function downloadExampleFile() { try {
  // 显示加载圈
  await uni.loading("正在获取示例数据")
  // 文件名及路径
  const fileUrl = `${ uni.H5_ROUTER_BASE_PATH }static/andorSifsToAscs.pgm`
  // 获取示例数据文件Response
  const fileRes = await fetch(fileUrl)
  // 将示例数据文件Response转换为ArrayBuffer
  const fileBuffer = await fileRes.arrayBuffer()
  // 如果示例数据文件ArrayBuffer长度为1766，则报错
  if (fileBuffer.byteLength === 1766) {
      throw new Error("找不到示例文件，请联系管理员")
  // 否则下载文件
  } else {
    // 隐藏加载圈
    uni.hideLoading()
    downloadFile(fileBuffer, "andorSifsToAscs.pgm")
  }
} catch (error) {
  // 隐藏加载圈
  uni.hideLoading()
  console.error("downloadExampleFile()报错: ", error)
  uni.showModal({
    showCancel: false,
    title: "下载示例数据报错",
    content: error.message,
  })
}}
  
  
</script>
